package www.utility;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FileDownload extends javax.servlet.http.HttpServlet {
    // 서블릿 버전, 생략 가능
    static final long serialVersionUID = 1L;
   
    // web.xml에 접근 가능
    private ServletConfig config = null;
    
    // 기본 생성자
    public FileDownload() {
        super();
    }       

    /**
     * 톰캣 실행시 최초 1번만 실행 됩니다.
     * init()은 생략가능
     * @param config web.xml에 접근가능, 서블릿 환경 정보 저장 객체
     */
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
    }
        
    // Form - get 방식 처리
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }   
    
    // Form - post 방식 처리
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doProcess(request, response);
    }    
    
    protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8"); 

        ServletContext ctx = config.getServletContext();
        
        // 저장 폴더를 절대 경로로 변환
        String downDir = ctx.getRealPath(request.getParameter("downDir"));
        
        // 파일명 받기
        String filename = request.getParameter("filename"); 
        
        // 한글 변환
        String fileNameEnc = new String(filename.getBytes("utf-8"),"ISO-8859-1");
        
        // 전체 절대 경로 조합
        File file = new File(downDir + "/" + filename);

        // 파일을 읽어올 크기 지정
        byte buffer[] = new byte[4096];

        // 브러우저가 파일을 저장하도록 지정
        response.setHeader("Content-Disposition", "attachment;filename=" + fileNameEnc + ";");

        try{
            if (file.isFile()){
                // 파일을 읽어 오는 역활
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                
                // 사이트에 접속된 접속자에게 출력
                BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
                
                int read = 0;
                // bis.read(buffer): 파일에서 4KB씩 읽어서
                // buffer에 저장
                // 파일의 끝이면 -1
                while ((read = bis.read(buffer)) != -1){
                    // 접속자로 출력
                    bos.write(buffer,0,read);
                }//while
                bis.close();
                bos.close();
            }
            
        }catch(Exception e){
            
        }        
    }
}
